home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / TURB_VIS / TCYBER25 / COMMON.ZIP / PCX.PAS < prev    next >
Pascal/Delphi Source File  |  1994-10-20  |  12KB  |  115 lines

  1. {
  2. Turbo Vision CyberTools 2.5
  3. (C) 1994 Steve Goldsmith
  4. All Rights Reserved
  5. }
  6.  
  7. UNIT PCX ;{$I APP.INC} {$X+} INTERFACE USES DOS , OBJECTS , {$IFDEF UseDLL} CYBERAPI ;{$ELSE} VGA ;{$ENDIF}
  8. CONST PCXMANUFACTURER =$0a ;PCXSTART256PAL =$0c ;PCXVER25 =0 ;PCXVER28PAL =2 ;PCXVER28NOPAL =3 ;PCXVER30 =5 ;
  9. PCXCOLORPAL =1 ;PCXGRAYPAL =2 ;PCXMAXXSIZE1 =640 ;PCXMAXYSIZE1 =480 ;PCXMAXXSIZE256 =320 ;PCXMAXYSIZE256 =200 ;
  10. PCXMAXENCODESIZE =16384 ;PCXMAXDECODESIZE =16384 ;PCXMEMALLOC =- 100 ;PCXNOTPCXFORMAT =- 101 ;PCXNOT2COLOR =- 102 ;
  11. PCXNOT256COLOR =- 103 ;PCXXSIZE =- 104 ;PCXYSIZE =- 105 ;TYPE PCX16PAL =ARRAY [ 0 .. 47 ]  OF BYTE ;
  12. PCXHEADER =RECORD MANUFACTURER , VERSION , ENCODING , BITSPERPIXEL :BYTE ;XMIN , YMIN , XMAX , YMAX , HRES ,
  13. VRES :INTEGER ;PALETTE :PCX16PAL ;RESERVED , COLORPLANES :BYTE ;BYTESPERLINE , PALETTETYPE :INTEGER ;FILLER :ARRAY [ 0 ..
  14. 57 ]  OF BYTE ;END ;PREADPCXFILE =^TREADPCXFILE ;TREADPCXFILE =OBJECT (TOBJECT)READERROR :INTEGER ;XSIZE , YSIZE ,
  15. ENCODEBUFPOS :WORD ;READFILESIZE , ENCODESIZE :LONGINT ;READFILE :FILE ;ENCODEBUFPTR :VGADATABUFPTR ;
  16. DECODEBUFPTR :VGADATABUFPTR ;HEADER :PCXHEADER ;READPALETTE :VGAPALETTE ;CONSTRUCTOR INIT (FILENAME :PATHSTR );
  17. DESTRUCTOR DONE ;VIRTUAL;FUNCTION GETENCODEBYTE :BYTE ;PROCEDURE DECODEFILE ;VIRTUAL;END ;
  18. PDECODEPCXFILE2 =^TDECODEPCXFILE2 ;TDECODEPCXFILE2 =OBJECT (TREADPCXFILE)CONSTRUCTOR INIT (FILENAME :PATHSTR );END ;
  19. PPCXTOCHRTABLE =^PPCXTOCHRTABLE ;TPCXTOCHRTABLE =OBJECT (TDECODEPCXFILE2)CONSTRUCTOR INIT (FILENAME :PATHSTR ;
  20. XLEN ,YLEN,CHEIGHT:WORD ;CHRTABLEPTR :VGACHRTABLEPTR );END ;PDECODEPCXFILE256 =^TDECODEPCXFILE256 ;
  21. TDECODEPCXFILE256 =OBJECT (TREADPCXFILE)CONSTRUCTOR INIT (FILENAME :PATHSTR );PROCEDURE READPAL256 ;PROCEDURE DECODEFILE
  22. ;VIRTUAL;PROCEDURE PALETTE256TO64 ;END ;PWRITEPCXFILE =^TWRITEPCXFILE ;
  23. TWRITEPCXFILE =OBJECT (TOBJECT)WRITEERROR :INTEGER ;ENCODEBUFPOS :WORD ;WRITEFILE :FILE ;ENCODEBUFPTR :VGADATABUFPTR ;
  24. HEADER :PCXHEADER ;CONSTRUCTOR INIT (FILENAME :PATHSTR );DESTRUCTOR DONE ;VIRTUAL;PROCEDURE WRITEHEADER ;
  25. PROCEDURE SETHEADER (XS ,YS:INTEGER ;BP ,CP:BYTE );PROCEDURE WRITEENCODEBYTE (E :BYTE );PROCEDURE FLUSHENCODEBUF ;
  26. PROCEDURE ENCODEFILE (PCXIMAGE :VGADATABUFPTR ;LINELEN :WORD );VIRTUAL;END ;PENCODEPCXFILE2 =^TENCODEPCXFILE2 ;
  27. TENCODEPCXFILE2 =OBJECT (TWRITEPCXFILE)PROCEDURE ENCODEFILE (PCXIMAGE :VGADATABUFPTR ;LINELEN :WORD );VIRTUAL;END ;
  28. PCHRTABLETOPCX =^TCHRTABLETOPCX ;TCHRTABLETOPCX =OBJECT (TENCODEPCXFILE2)CONSTRUCTOR INIT (FILENAME :PATHSTR ;
  29. XCHRS ,YCHRS,CHEIGHT:WORD ;CHRTABLEPTR :VGACHRTABLEPTR );END ;PENCODEPCXFILE256 =^TENCODEPCXFILE256 ;
  30. TENCODEPCXFILE256 =OBJECT (TWRITEPCXFILE)PROCEDURE ENCODEFILE (PCXIMAGE :VGADATABUFPTR ;LINELEN :WORD );VIRTUAL;
  31. PROCEDURE WRITEPAL256 (PAL :VGAPALETTEPTR );PROCEDURE PALETTE64TO256 (PAL :VGAPALETTEPTR );END ;
  32. CONST PCXDEF1BITPAL :PCX16PAL =($00 , $00 , $00 , $ff , $ff , $ff , $00 , $aa , $00 , $00 , $aa , $aa , $aa , $00 , $00 ,
  33. $aa , $00 , $aa , $aa , $aa , $00 , $aa , $aa , $aa , $55 , $55 , $55 , $55 , $55 , $ff , $55 , $ff , $55 , $55 , $ff ,
  34. $ff , $ff , $55 , $55 , $ff , $55 , $ff , $ff , $ff , $55 , $ff , $ff , $ff );
  35. IMPLEMENTATION USES MEMORY ;CONSTRUCTOR TREADPCXFILE.INIT (FILENAME:PATHSTR);BEGIN INHERITED INIT;ENCODEBUFPOS :=
  36. PCXMAXENCODESIZE ;ASSIGN (READFILE , FILENAME );{$I-}RESET (READFILE , 1 );{$I+}READERROR := IORESULT ;IF READERROR =0
  37. THEN BEGIN {$I-}READFILESIZE := FILESIZE (READFILE );{$I+}READERROR := IORESULT ;IF READERROR =0 THEN
  38. BEGIN {$I-}BLOCKREAD (READFILE , HEADER , SIZEOF (HEADER ));{$I+}READERROR := IORESULT ;IF READERROR =0 THEN BEGIN IF
  39. HEADER.MANUFACTURER =PCXMANUFACTURER THEN BEGIN IF HEADER.BITSPERPIXEL =8 THEN ENCODESIZE := READFILESIZE - SIZEOF
  40. (READPALETTE )- SIZEOF (HEADER )ELSE ENCODESIZE := READFILESIZE - SIZEOF (HEADER );ENCODEBUFPTR := MEMALLOC
  41. (PCXMAXENCODESIZE );IF ENCODEBUFPTR =NIL THEN READERROR := PCXMEMALLOC END ELSE READERROR := PCXNOTPCXFORMAT END END END
  42. END ;DESTRUCTOR TREADPCXFILE.DONE ;BEGIN IF ENCODEBUFPTR <> NIL THEN FREEMEM (ENCODEBUFPTR , PCXMAXENCODESIZE );IF
  43. DECODEBUFPTR <> NIL THEN FREEMEM (DECODEBUFPTR , HEADER.BYTESPERLINE * YSIZE );{$I-}CLOSE (READFILE );{$I+}READERROR :=
  44. IORESULT ;INHERITED DONE END ;FUNCTION TREADPCXFILE.GETENCODEBYTE :BYTE ;VAR O1lIII0lO0I1:WORD;BEGIN IF ENCODEBUFPOS
  45. =PCXMAXENCODESIZE THEN BEGIN ENCODEBUFPOS := 0 ;{$I-}BLOCKREAD (READFILE , ENCODEBUFPTR ^, PCXMAXENCODESIZE ,
  46. O1lIII0lO0I1 );{$I+}READERROR := IORESULT END ;GETENCODEBYTE := ENCODEBUFPTR ^[ ENCODEBUFPOS ] ;INC (ENCODEBUFPOS )END ;
  47. PROCEDURE TREADPCXFILE.DECODEFILE ;VAR OIOOIOl1lI,OOlIlOO0OlOI,O1lIOO0O100l:BYTE;OI11IIlOO110:WORD;OOllO11OOI0I:LONGINT;
  48. BEGIN OOllO11OOI0I := 1 ;OI11IIlOO110 := 0 ;WHILE OOllO11OOI0I < ENCODESIZE  DO BEGIN OIOOIOl1lI := GETENCODEBYTE ;INC
  49. (OOllO11OOI0I );IF (OIOOIOl1lI AND $c0 )=$c0 THEN BEGIN OIOOIOl1lI := (OIOOIOl1lI AND $3f )- 1 ;O1lIOO0O100l :=
  50. GETENCODEBYTE ;INC (OOllO11OOI0I );FOR OOlIlOO0OlOI := 0 TO OIOOIOl1lI  DO DECODEBUFPTR ^[ OI11IIlOO110 + OOlIlOO0OlOI ]
  51. := O1lIOO0O100l ;OI11IIlOO110 := OI11IIlOO110 + OOlIlOO0OlOI + 1 END ELSE BEGIN DECODEBUFPTR ^[ OI11IIlOO110 ] :=
  52. OIOOIOl1lI ;INC (OI11IIlOO110 )END END END ;CONSTRUCTOR TDECODEPCXFILE2.INIT (FILENAME:PATHSTR);
  53. BEGIN INHERITED INIT(FILENAME );IF READERROR =0 THEN BEGIN IF (HEADER.BITSPERPIXEL =1 )AND (HEADER.COLORPLANES =1 )THEN
  54. BEGIN XSIZE := HEADER.XMAX - HEADER.XMIN + 1 ;YSIZE := HEADER.YMAX - HEADER.YMIN + 1 ;IF XSIZE <= PCXMAXXSIZE1 THEN
  55. BEGIN IF YSIZE <= PCXMAXYSIZE1 THEN BEGIN DECODEBUFPTR := MEMALLOC (HEADER.BYTESPERLINE * YSIZE );IF DECODEBUFPTR =NIL
  56. THEN READERROR := PCXMEMALLOC END ELSE READERROR := PCXYSIZE END ELSE READERROR := PCXXSIZE END ELSE READERROR :=
  57. PCXNOT2COLOR END END ;CONSTRUCTOR TPCXTOCHRTABLE.INIT (FILENAME:PATHSTR;XLEN,YLEN,CHEIGHT:WORD;
  58. CHRTABLEPTR:VGACHRTABLEPTR);VAR OOIO,OOIl,OI11II10lI0I,O1lO011OI01l,O1Ol110OlOO0,OOIO1llOlII1,O1l110l010:WORD;
  59. BEGIN INHERITED INIT(FILENAME );IF READERROR =0 THEN BEGIN DECODEFILE ;IF READERROR =0 THEN BEGIN ACCESSFONTMEM ;
  60. FOR OOIO := 0 TO VGACHRTABLESIZE - 1  DO CHRTABLEPTR ^[ OOIO ] := 0 ;OI11II10lI0I := 0 ;O1lO011OI01l := 0 ;O1Ol110OlOO0
  61. := XLEN * VGAMAXCHRHEIGHT ;IF HEADER.BYTESPERLINE > XLEN THEN OOIO1llOlII1 := XLEN - 1 ELSE OOIO1llOlII1 :=
  62. HEADER.BYTESPERLINE - 1 ;IF YSIZE > YLEN * CHEIGHT THEN O1l110l010 := YLEN * CHEIGHT - 1 ELSE O1l110l010 := YSIZE - 1 ;
  63. FOR OOIl := 0 TO O1l110l010  DO BEGIN FOR OOIO := 0 TO OOIO1llOlII1  DO CHRTABLEPTR ^[ OOIO * VGAMAXCHRHEIGHT +
  64. O1lO011OI01l + OI11II10lI0I ] := DECODEBUFPTR ^[ OOIl * HEADER.BYTESPERLINE + OOIO ] XOR $ff ;INC (OI11II10lI0I );IF
  65. OI11II10lI0I =CHEIGHT THEN BEGIN OI11II10lI0I := 0 ;O1lO011OI01l := O1lO011OI01l + O1Ol110OlOO0 END END ;ACCESSSCREENMEM
  66. END END END ;CONSTRUCTOR TDECODEPCXFILE256.INIT (FILENAME:PATHSTR);BEGIN INHERITED INIT(FILENAME );IF READERROR =0 THEN
  67. BEGIN IF (HEADER.VERSION =PCXVER30 )AND (HEADER.BITSPERPIXEL =8 )THEN BEGIN XSIZE := HEADER.XMAX - HEADER.XMIN + 1 ;
  68. YSIZE := HEADER.YMAX - HEADER.YMIN + 1 ;IF XSIZE <= PCXMAXXSIZE256 THEN BEGIN IF YSIZE <= PCXMAXYSIZE256 THEN
  69. BEGIN DECODEBUFPTR := NIL ;DECODEBUFPTR := MEMALLOC (XSIZE * YSIZE );IF DECODEBUFPTR =NIL THEN READERROR := PCXMEMALLOC
  70. END ELSE READERROR := PCXYSIZE END ELSE READERROR := PCXXSIZE END ELSE READERROR := PCXNOT256COLOR END END ;
  71. PROCEDURE TDECODEPCXFILE256.READPAL256 ;BEGIN {$I-}SEEK (READFILE , SIZEOF (HEADER )+ ENCODESIZE );{$I+}READERROR :=
  72. IORESULT ;IF READERROR =0 THEN BEGIN {$I-}BLOCKREAD (READFILE , READPALETTE , SIZEOF (READPALETTE ));{$I+}READERROR :=
  73. IORESULT END END ;PROCEDURE TDECODEPCXFILE256.DECODEFILE ;BEGIN INHERITED DECODEFILE;READPAL256 END ;
  74. PROCEDURE TDECODEPCXFILE256.PALETTE256TO64 ;VAR OI10Illl01l,OI11I0I0ll0:BYTE;BEGIN FOR OI11I0I0ll0 := 0 TO VGADACREGMAX
  75.  DO FOR OI10Illl01l := 0 TO VGARGBMAX  DO READPALETTE [ OI11I0I0ll0 , OI10Illl01l ] := READPALETTE [ OI11I0I0ll0 ,
  76. OI10Illl01l ] SHR 2 END ;CONSTRUCTOR TWRITEPCXFILE.INIT (FILENAME:PATHSTR);BEGIN INHERITED INIT;ASSIGN (WRITEFILE ,
  77. FILENAME );{$I-}REWRITE (WRITEFILE , 1 );{$I+}WRITEERROR := IORESULT ;IF WRITEERROR =0 THEN BEGIN ENCODEBUFPTR :=
  78. MEMALLOC (PCXMAXENCODESIZE );IF ENCODEBUFPTR =NIL THEN WRITEERROR := PCXMEMALLOC END END ;
  79. PROCEDURE TWRITEPCXFILE.WRITEHEADER ;BEGIN {$I-}BLOCKWRITE (WRITEFILE , HEADER , SIZEOF (HEADER ));{$I+}WRITEERROR :=
  80. IORESULT END ;PROCEDURE TWRITEPCXFILE.SETHEADER (XS,YS:INTEGER;BP,CP:BYTE);BEGIN WITH HEADER DO BEGIN MANUFACTURER :=
  81. PCXMANUFACTURER ;VERSION := PCXVER30 ;ENCODING := 1 ;BITSPERPIXEL := BP ;XMIN := 0 ;YMIN := 0 ;XMAX := XS - 1 ;YMAX := YS
  82. - 1 ;HRES := 640 ;VRES := 480 ;CASE BITSPERPIXEL  OF 1 :PALETTE := PCXDEF1BITPAL ;8 :PALETTE := PCXDEF1BITPAL END ;
  83. RESERVED := 0 ;COLORPLANES := CP ;BYTESPERLINE := XS DIV (8 DIV BP );IF XS AND $07 <> 0 THEN INC (BYTESPERLINE );
  84. CASE BITSPERPIXEL  OF 1 :PALETTETYPE := 0 ;8 :PALETTETYPE := PCXCOLORPAL END ;FILLCHAR (FILLER , SIZEOF (FILLER ), 0 )END
  85. END ;DESTRUCTOR TWRITEPCXFILE.DONE ;BEGIN IF ENCODEBUFPTR <> NIL THEN FREEMEM (ENCODEBUFPTR , PCXMAXENCODESIZE );
  86. {$I-}CLOSE (WRITEFILE );{$I+}WRITEERROR := IORESULT ;INHERITED DONE END ;PROCEDURE TWRITEPCXFILE.WRITEENCODEBYTE (E:BYTE);
  87. BEGIN IF ENCODEBUFPOS =PCXMAXENCODESIZE THEN BEGIN {$I-}BLOCKWRITE (WRITEFILE , ENCODEBUFPTR ^, PCXMAXENCODESIZE );
  88. {$I+}WRITEERROR := IORESULT ;ENCODEBUFPOS := 0 END ;ENCODEBUFPTR ^[ ENCODEBUFPOS ] := E ;INC (ENCODEBUFPOS )END ;
  89. PROCEDURE TWRITEPCXFILE.FLUSHENCODEBUF ;VAR OI1OOO0OO0:WORD;BEGIN IF ENCODEBUFPOS > 0 THEN BEGIN {$I-}BLOCKWRITE
  90. (WRITEFILE , ENCODEBUFPTR ^, ENCODEBUFPOS , OI1OOO0OO0 );{$I+}WRITEERROR := IORESULT ;ENCODEBUFPOS := 0 END END ;
  91. PROCEDURE TWRITEPCXFILE.ENCODEFILE (PCXIMAGE:VGADATABUFPTR;LINELEN:WORD);VAR OOlIlOO0OlOI:BYTE;
  92. OOlOOO1I1OI0,O10OIIlIlO0O0,O10OIIllll0IO,OOIl:WORD;BEGIN FOR OOIl := 0 TO HEADER.YMAX  DO BEGIN OOlOOO1I1OI0 := LINELEN *
  93. OOIl ;O10OIIllll0IO := OOlOOO1I1OI0 + HEADER.BYTESPERLINE - 1 ;OOlIlOO0OlOI := 0 ;WHILE OOlOOO1I1OI0 <= O10OIIllll0IO
  94.  DO BEGIN O10OIIlIlO0O0 := OOlOOO1I1OI0 + 1 ;WHILE (O10OIIlIlO0O0 <= O10OIIllll0IO )AND (OOlIlOO0OlOI < 62 )AND (PCXIMAGE
  95. ^[ OOlOOO1I1OI0 ] =PCXIMAGE ^[ O10OIIlIlO0O0 ] ) DO BEGIN INC (O10OIIlIlO0O0 );INC (OOlIlOO0OlOI )END ;IF OOlIlOO0OlOI >
  96. 0 THEN BEGIN INC (OOlIlOO0OlOI );WRITEENCODEBYTE (OOlIlOO0OlOI OR $c0 );WRITEENCODEBYTE (PCXIMAGE ^[ OOlOOO1I1OI0 ] );
  97. OOlOOO1I1OI0 := O10OIIlIlO0O0 ;OOlIlOO0OlOI := 0 END ELSE BEGIN IF (PCXIMAGE ^[ OOlOOO1I1OI0 ] AND $c0 )=$c0 THEN
  98. WRITEENCODEBYTE ($c1 );WRITEENCODEBYTE (PCXIMAGE ^[ OOlOOO1I1OI0 ] );INC (OOlOOO1I1OI0 )END END END END ;
  99. PROCEDURE TENCODEPCXFILE2.ENCODEFILE (PCXIMAGE:VGADATABUFPTR;LINELEN:WORD);BEGIN INHERITED ENCODEFILE(PCXIMAGE , LINELEN
  100. );FLUSHENCODEBUF END ;CONSTRUCTOR TCHRTABLETOPCX.INIT (FILENAME:PATHSTR;XCHRS,YCHRS,CHEIGHT:WORD;
  101. CHRTABLEPTR:VGACHRTABLEPTR);VAR OOIO,OOIl,OI11II10lI0I,O1lO011OI01l,O1Ol110OlOO0,O10O0lIIll000:WORD;
  102. OOO011IOlIOI:VGADATABUFPTR;BEGIN INHERITED INIT(FILENAME );IF WRITEERROR =0 THEN BEGIN OOO011IOlIOI := MEMALLOC (XCHRS *
  103. YCHRS * CHEIGHT );IF OOO011IOlIOI <> NIL THEN BEGIN ACCESSFONTMEM ;OI11II10lI0I := 0 ;O1lO011OI01l := 0 ;O1Ol110OlOO0 :=
  104. XCHRS * VGAMAXCHRHEIGHT ;O10O0lIIll000 := YCHRS * CHEIGHT ;FOR OOIl := 0 TO O10O0lIIll000 - 1  DO BEGIN FOR OOIO := 0 TO
  105. XCHRS - 1  DO OOO011IOlIOI ^[ OOIl * XCHRS + OOIO ] := CHRTABLEPTR ^[ OOIO * VGAMAXCHRHEIGHT + O1lO011OI01l +
  106. OI11II10lI0I ] XOR $ff ;INC (OI11II10lI0I );IF OI11II10lI0I =CHEIGHT THEN BEGIN OI11II10lI0I := 0 ;O1lO011OI01l :=
  107. O1lO011OI01l + O1Ol110OlOO0 END END ;ACCESSSCREENMEM ;SETHEADER (XCHRS * 8 , O10O0lIIll000 , 1 , 1 );WRITEHEADER ;
  108. ENCODEFILE (OOO011IOlIOI , HEADER.BYTESPERLINE );FREEMEM (OOO011IOlIOI , XCHRS * YCHRS * CHEIGHT )END END END ;
  109. PROCEDURE TENCODEPCXFILE256.ENCODEFILE (PCXIMAGE:VGADATABUFPTR;LINELEN:WORD);BEGIN INHERITED ENCODEFILE(PCXIMAGE ,
  110. LINELEN );WRITEENCODEBYTE (PCXSTART256PAL );FLUSHENCODEBUF END ;PROCEDURE TENCODEPCXFILE256.WRITEPAL256
  111. (PAL:VGAPALETTEPTR);BEGIN {$I-}BLOCKWRITE (WRITEFILE , PAL ^, SIZEOF (PAL ^));{$I+}WRITEERROR := IORESULT END ;
  112. PROCEDURE TENCODEPCXFILE256.PALETTE64TO256 (PAL:VGAPALETTEPTR);VAR OI10Illl01l,OI11I0I0ll0:BYTE;BEGIN FOR OI11I0I0ll0 :=
  113. 0 TO VGADACREGMAX  DO FOR OI10Illl01l := 0 TO VGARGBMAX  DO PAL ^[ OI11I0I0ll0 , OI10Illl01l ] := PAL ^[ OI11I0I0ll0 ,
  114. OI10Illl01l ] SHL 2 END ;END .
  115.